package com.ys.day27.p7线程局部变量ThreadLocal;

/**
 * 描述: 学生工厂类,用于创建学生对象
 *
 * 将创建的学生对象(共享资源) 注入到ThreadLocal中
 *
 * @author CodeYang
 * @version 2021/1/7 1:17
 */
public class StudentFactory {

    /**
     * 线程局部变量: 里面存储的共享资源,交给当前线程使用,每个线程都有自己独立的共享资源副本
     * 在线程没有结束前,共享一个对象的操作.
     * threadlocal而是一个线程内部的存储类，可以在指定线程内存储数据，数据存储以后，只有指定线程可以得到存储数据，官方解释如下。
     * 一般管理id等唯一原子操作等
     */
    private static  ThreadLocal<Student> threadLocal = new ThreadLocal<>();
    /**
     * 从共享资源里面获取当前Student对象
     * 步骤：
     * 1 调用ThreadLocal的get()方法获取共享资源对象
     * 2 判断获取的对象是否为空
     * 3 条件成立：表示获取的共享资源对象为空
     * 4 创建Student对象
     * 5 将创建的Student对象注入到ThreadLocal里面
     * 6 返回Student对象
     * @return 当前Student对象
     *
     *  只有当前线程可以访问,本线程存储的对象资源
     */
    public static  Student getCurrentStudent(){
        Student student = threadLocal.get();
        if (null == student){
            student = new Student();
            threadLocal.set(student);
        }
        return student;
    }
}
